#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <sys/stat.h>
#include <pwd.h>
#include <grp.h>
#include <time.h>

void handle_ls(int sock) {
    // 打开当前目录，并遍历其中的每个文件
    DIR *d;
    struct dirent *dir;
    d = opendir(".");
    if (d) {
        char list[1024] = {0};
        while ((dir = readdir(d)) != NULL) {
            struct stat st;
            stat(dir->d_name, &st);

            // 根据需要构造文件信息字符串，例如：
            // "-rw-r--r-- 1 root root 1024 May 15 12:34 file.txt\n"
            char info[1024];
            snprintf(info, sizeof(info), "%s %ld %s %s %lld %s %s\n",
                     get_permissions(st.st_mode),
                     st.st_nlink,
                     get_username(st.st_uid),
                     get_groupname(st.st_gid),
                     st.st_size,
                     get_time_string(st.st_mtime),
                     dir->d_name);
                     
            strcat(list, info); // 将文件信息添加到列表缓冲区
        }
        closedir(d); // 关闭目录

        write(sock, list, strlen(list)); // 发送文件列表给客户端
    } else {
        perror("opendir");
        write(sock, "Error opening directory\n", strlen("Error opening directory\n"));
    }
}

// 获取文件权限字符串（例如 "-rw-r--r--"）
char *get_permissions(mode_t mode) {
    static char perms[10] = {0};
    strcpy(perms, "---------");
    if (S_ISDIR(mode)) perms[0] = 'd';
    if (mode & S_IRUSR) perms[1] = 'r';
    if (mode & S_IWUSR) perms[2] = 'w';
    if (mode & S_IXUSR) perms[3] = 'x';
    if (mode & S_IRGRP) perms[4] = 'r';
    if (mode & S_IWGRP) perms[5] = 'w';
    if (mode & S_IXGRP) perms[6] = 'x';
    if (mode & S_IROTH) perms[7] = 'r';
    if (mode & S_IWOTH) perms[8] = 'w';
    if (mode & S_IXOTH) perms[9] = 'x';
    return perms;
}

// 获取用户名字
char *get_username(uid_t uid) {
    struct passwd *pw = getpwuid(uid);
    return pw ? pw->pw_name : "unknown";
}

// 获取用户组名字
char *get_groupname(gid_t gid) {
    struct group *gr = getgrgid(gid);
    return gr ? gr->gr_name : "unknown";
}

// 获取时间字符串（例如 "May 15 12:34"）
char *get_time_string(time_t t) {
    static char timebuf[64];
    strftime(timebuf, sizeof(timebuf), "%b %d %H:%M", localtime(&t));
    return timebuf;
}